package com.spring.redis.operation.service.base.impl;

import com.spring.redis.operation.service.base.ZSetRedisBaseService;
import lombok.NonNull;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * redis Operation zset class
 *
 * @author zhouyu
 */
@Service
public class ZSetRedisBaseServiceImpl implements ZSetRedisBaseService {

    private final ZSetOperations<String, Object> zSetOperations;

    public ZSetRedisBaseServiceImpl(ZSetOperations<String, Object> zSetOperations) {
        this.zSetOperations = zSetOperations;
    }

    /**
     * 添加一个元素
     *
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Boolean 是否添加成功
     */
    @Override
    public Boolean zAdd(@NonNull String key, @NonNull String value, @NonNull double score) {
        return zSetOperations.add(key, value, score);
    }

    /**
     * 删除元素
     *
     * @param key    key
     * @param values values
     * @return java.lang.Long
     */
    @Override
    public Long zRemove(@NonNull String key, @NonNull Object... values) {
        return zSetOperations.remove(key, values);
    }

    /**
     * 增加或减少score
     *
     * @param key   key
     * @param value value
     * @param score score
     * @return java.lang.Double
     */
    @Override
    public Double zIncrementScore(@NonNull String key, @NonNull String value, double score) {
        return zSetOperations.incrementScore(key, value, score);
    }

    /**
     * 查询value对应的score
     *
     * @param key   key
     * @param value value
     * @return java.lang.Double
     */
    @Override
    public Double zScore(@NonNull String key, @NonNull String value) {
        return zSetOperations.score(key, value);
    }

    /**
     * 获取value在zset中的排名
     *
     * @param key   key
     * @param value value
     * @return java.lang.Long 排名值
     */
    @Override
    public Long zRank(@NonNull String key, @NonNull String value) {
        return zSetOperations.rank(key, value);
    }

    /**
     * 返回集合的长度
     *
     * @param key key
     * @return java.lang.Long 长度值
     */
    @Override
    public Long zSize(@NonNull String key) {
        return zSetOperations.size(key);
    }

    /**
     * 查询集合中指定顺序的值, 0 -1 表示获取全部的集合内容,返回有序的集合，score小的在前面
     *
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    @Override
    public Set<Object> zRange(@NonNull String key, int start, int end) {
        return zSetOperations.range(key, start, end);
    }

    /**
     * 查询集合中指定顺序的值和score，0, -1 表示获取全部的集合内容
     *
     * @param key   key
     * @param start start
     * @param end   end
     * @return java.util.Set
     */
    @Override
    public Set<ZSetOperations.TypedTuple<Object>> zRangeWithScore(@NonNull String key, int start, int end) {
        return zSetOperations.rangeWithScores(key, start, end);
    }

    /**
     * 查询集合中指定顺序的值,返回有序的集合中,score大的在前面
     *
     * @param key   key
     * @param start key
     * @param end   end
     * @return java.util.Set 满足条件的集合
     */
    @Override
    public Set<Object> zReverseRange(@NonNull String key, int start, int end) {
        return zSetOperations.reverseRange(key, start, end);
    }

    /**
     * 根据score的值，来获取满足条件的集合
     *
     * @param key key
     * @param min min
     * @param max max
     * @return java.util.Set 满足条件的集合
     */
    @Override
    public Set<Object> zRangeByScore(@NonNull String key, int min, int max) {
        return zSetOperations.rangeByScore(key, min, max);
    }

}
